#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <map>
#include <set>
#include <climits>
#include <cassert>
#include <cctype>
using namespace std;

typedef long long ll;
typedef double dbl;
typedef long double ld;

#define mp make_pair
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) x.begin(),x.end()
#define X first
#define Y second

const int maxn = 1000 * 100 + 1;
const dbl eps = (dbl)1e-5;
dbl x[maxn], rad[maxn];

bool emp(pair<dbl, dbl> a) {
	return a.X > a.Y;
}

int main() {
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	
	while (true) {
		int n;
		scanf("%d", &n);
		if (n == 0) break;
		for (int i = 0; i < n; i++)
			scanf("%lf%lf", &x[i], &rad[i]);
		dbl l = 0, r = maxn;
		while (r - l > eps) {
			dbl mid = (r + l) / 2.;
			pair<dbl, dbl> segm = mp(1, -1);
			bool flag = false;
			for (int i = 0; i < n; i++) {
				pair<dbl, dbl> cur_segm;
				if (rad[i] * rad[i] - mid * mid / 4 >= 0) {
					cur_segm = mp(x[i] - sqrt(rad[i] * rad[i] - mid * mid / 4), x[i] + sqrt(rad[i] * rad[i] - mid * mid / 4));
				} else {
					cur_segm = mp(1, -1);
				}
				if (emp(segm)) {
					segm = cur_segm;
					if (segm.Y - segm.X >= mid) {
						flag = true;
						break;
					}
					continue;
				}
				if (cur_segm.X > segm.Y || emp(cur_segm)) {
					segm = cur_segm;
					if (segm.Y - segm.X >= mid) {
						flag = true;
						break;
					}
					continue;
				} else {
					segm.X = segm.X;
					segm.Y = cur_segm.Y;
					if (segm.Y - segm.X >= mid) {
						flag = true;
						break;
					}
				}				
			}

			if (flag) l = mid;
			else r = mid;
		}
		printf("%.5lf\n", l);
	}
	
	return 0;
}